package com.schoolcloud.common.model;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

/**
 * 其他模块发送给通知模块的通知请求实体类
 * 用于统一各模块的通知请求格式
 *
 * @author hongmizfb
 * @date 2025/08/17
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NotificationRequest {

    /**
     * 通知类型（与模板表中的type字段对应）
     * 如：follow(关注), like(点赞), finder_claim(拾主认领), owner_claim(失主认领)
     */
    @NotBlank(message = "通知类型不能为空")
    private String type;

    /**
     * 触发者ID（可选）
     * 如：关注者ID、点赞用户ID，系统通知可为null
     */
    private Integer senderId;

    /**
     * 接收者ID（必填）
     * 通知的目标用户ID
     */
    @NotNull(message = "接收者ID不能为空")
    private Integer receiverId;

    /**
     * 模板变量（键值对）
     * 存储模板中需要替换的动态变量，如：
     * {"sender_name": "张三", "item_title": "蓝色背包"}
     */
    @Builder.Default
    private Map<String, String> variables = new HashMap<>();

    /**
     * 关联资源ID（可选）
     * 如：被点赞的帖子ID、失物信息ID
     */
    private Integer relatedId;

    /**
     * 关联资源类型（可选）
     * 如：post(帖子), comment(评论), item(失物)
     */
    private String relatedType;

    /**
     * 扩展参数（可选）
     * 用于存储特殊需求，如：是否需要邮件推送、推送优先级等
     */
    @Builder.Default
    private Map<String, Object> extra = new HashMap<>();

    /**
     * 添加模板变量
     */
    public void addVariable(String key, String value) {
        this.variables.put(key, value);
    }

    /**
     * 添加扩展参数
     */
    public void addExtra(String key, Object value) {
        this.extra.put(key, value);
    }
}
